package com.atguigu.bigdata.scala.chapter05

object Scala04_Function {

    def main(args: Array[String]): Unit = {

        // TODO Function - 函数声明和使用
        // 过场动画
        // 1. 无参，无返回值
        def fun1(): Unit = {
            println("fun1...")
        }

        // 函数的调用
        // 函数名（参数）
        //fun1()
        // 如果函数声明时没有参数，那么调用时，小括号可以省略的
        //fun1
        //println(1 toString)

        // 2. 无参，有返回值
        def fun2(): String = {
            return "zhangsan"
        }

        //println(fun2())
        //val s = fun2()
        //println(s)

        // 3. 有参，无返回值
        // 参数的声明方式 => 参数名：参数类型,此时参数类型不能省略。
        def fun3( name : String ): Unit = {
            println( "Name = " + name )
            //name = name.substring(0, 1)
        }

        //fun3("zhangsan") // 如果函数声明的了参数，那么调用时必须要传递参数
        // 方法的参数传递是值传递还是引用传递？
        // 值传递 ：方法参数传递，传递的就是参数的值，基本数据类型，值是多少，那么传的就是多少
        //         如果参数为引用类型，传递的依然是值，这里的值其实是引用类型数据的内存地址

        // 4. 有参，有返回值
        def fun4( name : String ): String = {
            return "Name = " + name
        }

        //val s1 = fun4( "zhangsan" )
        //println(s1)

        // 5. 多参，无返回值
        // 函数的参数列表中，如果有多个参数，那么参数之间使用逗号分隔
        def fun5( name:String, age : Int ): Unit = {
            println( s"Name = ${name}, Age = ${age}" )
        }

        // 如果函数声明中有多个参数
        // 那么调用时，传递的参数数量应该匹配，且按照声明顺序进行赋值和匹配
        //fun5( "zhangsan" ) (X)
        //fun5( 20, "zhangsan" )(X)
        //fun5("zhangsan", 20) // (OK)

        // 6. 多参，有返回值
        def fun6( name:String, age:Int ): String = {
            return "Name = " + name + ", Age = " + age
        }

        // 函数的参数和返回值是函数的一部分，所以参数不能多传
        //val s2 = fun6( "zhangsan", 30 )
        //println(s2)

        // 7. 函数参数的个数没有约束的。
        //    函数的参数不能超过22个，如果超过22个，会发生错误
        def fun7(
            age0 : Int,
            age1 : Int,
            age2 : Int,
            age3 : Int,
            age4 : Int,
            age5 : Int,
            age6 : Int,
            age7 : Int,
            age8: Int,
            age9 : Int,
            age10 : Int,
            age11 : Int,
            age12 : Int,
            age13 : Int,
            age14 : Int,
            age15 : Int,
            age16 : Int,
            age17 : Int,
            age18 : Int,
            age19 : Int,
            age20 : Int,
            age21 : Int,
            age22 : Int,
            age23 : Int,
            age24 : Int
                ) : Unit = {
            println("fun7")
        }

        fun7(1,2,3,4,5,6,7,8,9,0, 1,2,3,4,5,6,7,8,9,0, 1,2,3,4,5)
    }
}
